/** 
 * JPanel um ein Exemplar der Bibliothek hinzuzufuegen
 * 
 * Datei: PanelExemplar.java            Autor: Simon Schindelmann 
 * Datum: 3.11.11                       Version: 0.1
 * 
 */
package medienverwaltung.simulation;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import medienverwaltung.Exemplar;
import medienverwaltung.Medium;
import medienverwaltung.MediumIstZuGross;
import medienverwaltung.Mediumverwalter;
import medienverwaltung.Regal;
import medienverwaltung.RegalEtage;
import medienverwaltung.Regalabschnitt;
import medienverwaltung.Standort;
import medienverwaltung.Standortverwalter;

public class PanelExemplar extends JPanel
{
  private static final long serialVersionUID = 1008579737932258685L;
  //Speichert die aktuelle Sprache die verwendet wird.
  private Uebersetzung uebersetzung = Uebersetzung.gibSprache ();
  private JButton hinzufuegen;
  private JLabel medium, standort, regal, regalEtage, abschnitt;
  private JTextField txt_medium, txt_status;
  private String[] standorte, regale, etagen, abschnitte = null;
  private int[] sid = null;
  private JComboBox<String> ortcombo, regalcombo, etagecombo, 
  	abschnittcombo;


  /**
   * Das Layout wird gesetzt und die Labels, Textfelder und Buttons 
   * werden initialisiert und dem JPanel hinzugefuegt.
   */
  public PanelExemplar ()
  {
    init ();
    setLayout (new GridLayout (6, 2));
    add (medium);
    add (txt_medium);
    add (standort);
    add (ortcombo);
    add (regal);
    add (regalcombo);
    add (regalEtage);
    add (etagecombo);
    add (abschnitt);
    add (abschnittcombo);
    add (hinzufuegen);
    add (txt_status); 
  }


  /**
   * Hier werden die Labels, Textfelder, Buttons initialisiert.
   */
  public void init ()
  {
    standorteAnzeigen ();
    ortcombo = new JComboBox<String> (standorte);
    regaleAnzeigen ();
    regalcombo = new JComboBox<String> (regale);
    etagenAnzeigen ();
    etagecombo = new JComboBox<String> (etagen);
    abschnitteAnzeigen ();
    abschnittcombo = new JComboBox<String> (abschnitte);
    medium = new JLabel ("  " + uebersetzung.lokal
        .gibUebersetzung ("MediumNr") + ": ");
    standort = new JLabel ("  " + uebersetzung.lokal
        .gibUebersetzung ("Standorte") + ": ");
    regal = new JLabel ("  " + uebersetzung.lokal
	.gibUebersetzung ("Regale") + ": ");
    regalEtage = new JLabel ("  " + uebersetzung.lokal
        .gibUebersetzung ("Etagen") + ": ");
    abschnitt = new JLabel ("  " + uebersetzung.lokal
        .gibUebersetzung ("Abschnitte") + ": ");
    txt_medium = new JTextField ();
    hinzufuegen = new JButton (uebersetzung.lokal
        .gibUebersetzung ("Hinzufuegen"));
    txt_status = new JTextField ();
    txt_status.setEditable (false);

    actionListenerErzeugen ();
  }


  /**
   * Erzeugt die ActionListener. Die ActionListener aktualisieren die
   * Comboboxen wenn ein anderer Wert ausgewaehlt wurde. Damit die
   * Aenderungen auch in Combobox angezeigt werden, muessen die 
   * Comboboxen entfernt und wieder hinzugefuegt werden. Damit die
   * Elemente in der richtigen Reihenfolge angezeigt werden muessen auch
   * die Elemente nach der Combox entfernt werden und wieder 
   * hinzugefuegt werden.  
   */
  public void actionListenerErzeugen ()
  {
    ortcombo.addActionListener (new ActionListener ()
    {
      @Override
      public void actionPerformed (ActionEvent e)
      {
        for (ActionListener al : hinzufuegen.getActionListeners ())
        {
          hinzufuegen.removeActionListener (al);
        }
        for (ActionListener al : ortcombo.getActionListeners ())
        {
          ortcombo.removeActionListener (al);
        }
        for (ActionListener al : regalcombo.getActionListeners ())
        {
          regalcombo.removeActionListener (al);
        }
        for (ActionListener al : etagecombo.getActionListeners ())
        {
          etagecombo.removeActionListener (al);
        }
        for (ActionListener al : abschnittcombo.getActionListeners ())
        {
          abschnittcombo.removeActionListener (al);
        }

        remove (regal);
        remove (regalEtage);
        remove (abschnitt);
        remove (hinzufuegen);
        remove (txt_status);
        remove (regalcombo);
        remove (etagecombo);
        remove (abschnittcombo);
        regaleAnzeigen ();
        regalcombo = new JComboBox<String> (regale);
        etagenAnzeigen ();
        etagecombo = new JComboBox<String> (etagen);
        abschnitteAnzeigen ();
        abschnittcombo = new JComboBox<String> (abschnitte);
        add (regal);
        add (regalcombo);
        add (regalEtage);
        add (etagecombo);
        add (abschnitt);
        add (abschnittcombo);
        add (hinzufuegen);
        add (txt_status);
        validate ();
        actionListenerErzeugen ();
      }
    });

    regalcombo.addActionListener (new ActionListener ()
    {
      @Override
      public void actionPerformed (ActionEvent e)
      {
        for (ActionListener al : hinzufuegen.getActionListeners ())
        {
          hinzufuegen.removeActionListener (al);
        }
        for (ActionListener al : hinzufuegen.getActionListeners ())
        {
          hinzufuegen.removeActionListener (al);
        }
        for (ActionListener al : ortcombo.getActionListeners ())
        {
          ortcombo.removeActionListener (al);
        }
        for (ActionListener al : regalcombo.getActionListeners ())
        {
          regalcombo.removeActionListener (al);
        }
        for (ActionListener al : etagecombo.getActionListeners ())
        {
          etagecombo.removeActionListener (al);
        }
        for (ActionListener al : abschnittcombo.getActionListeners ())
        {
          abschnittcombo.removeActionListener (al);
        }

        remove (regalEtage);
        remove (abschnitt);
        remove (hinzufuegen);
        remove (txt_status);
        remove (etagecombo);
        remove (abschnittcombo);
        etagenAnzeigen ();
        etagecombo = new JComboBox<String> (etagen);
        abschnitteAnzeigen ();
        abschnittcombo = new JComboBox<String> (abschnitte);
        add (regalEtage);
        add (etagecombo);
        add (abschnitt);
        add (abschnittcombo);
        add (hinzufuegen);
        add (txt_status);
        validate ();
        actionListenerErzeugen ();
      }
    });

    etagecombo.addActionListener (new ActionListener ()
    {
      @Override
      public void actionPerformed (ActionEvent e)
      {
        for (ActionListener al : hinzufuegen.getActionListeners ())
        {
          hinzufuegen.removeActionListener (al);
        }
        for (ActionListener al : hinzufuegen.getActionListeners ())
        {
          hinzufuegen.removeActionListener (al);
        }
        for (ActionListener al : ortcombo.getActionListeners ())
        {
          ortcombo.removeActionListener (al);
        }
        for (ActionListener al : regalcombo.getActionListeners ())
        {
          regalcombo.removeActionListener (al);
        }
        for (ActionListener al : etagecombo.getActionListeners ())
        {
          etagecombo.removeActionListener (al);
        }
        for (ActionListener al : abschnittcombo.getActionListeners ())
        {
          abschnittcombo.removeActionListener (al);
        }
        remove (abschnitt);
        remove (hinzufuegen);
        remove (txt_status);
        remove (abschnittcombo);
        abschnitteAnzeigen ();
        abschnittcombo = new JComboBox<String> (abschnitte);
        add (abschnitt);
        add (abschnittcombo);
        add (hinzufuegen);
        add (txt_status);

        validate ();
        actionListenerErzeugen ();
      }
    });

    hinzufuegen.addActionListener (new ActionListener ()
    {
      @Override
      public void actionPerformed (ActionEvent e)
      {
        hinzufuegen ();
      }
    });
  }


  /**
   * Erzeugen der Combobox mit den Standorten
   */
  public void standorteAnzeigen ()
  {
    Standortverwalter sv = new Standortverwalter ();
    ArrayList<Standort> liste = sv.gibStandortListe ();

    if (liste.size () != 0)
    {
      standorte = new String[liste.size ()];
      sid = new int[liste.size ()];
      for (int i = 0; i < liste.size (); i++)
      {
        standorte[i] = "" + liste.get (i).gibName ();
        sid[i] = liste.get (i).gibStandortId ();
      }
    }
    else
    {
      standorte = new String[1];
      standorte[0] = uebersetzung.lokal
          .gibUebersetzung ("Keine Standorte vorhanden");
    }
  }


  /**
   * Erzeugen der Combobox mit den Regalen
   */
  public void regaleAnzeigen ()
  {
    int ortindex, id;
    Standort s = null;
    Standortverwalter sv = new Standortverwalter ();
    ArrayList<Regal> liste = new ArrayList<Regal> ();

    if ( ((String) ortcombo.getSelectedItem ())
        .equals (uebersetzung.lokal
            .gibUebersetzung ("Keine Standorte vorhanden")))
    {
    }
    else
    {
      ortindex = ortcombo.getSelectedIndex ();
      id = sid[ortindex];
      s = sv.gibStandort (id);
    }

    if (s != null)
    {
      liste = s.gibRegalListe ();
    }

    if (liste.size () != 0)
    {
      regale = new String[liste.size ()];
      for (int i = 0; i < liste.size (); i++)
      {
        regale[i] = "" + liste.get (i).gibRegalId ();
      }
    }
    else
    {
      regale = new String[1];
      regale[0] = uebersetzung.lokal
          .gibUebersetzung ("Keine Regale vorhanden");
    }
  }


  /**
   * Erzeugen der Combox mit den Regaletagen
   */
  public void etagenAnzeigen ()
  {
    int ortindex, id, rid = 0;
    Standort s = null;
    Standortverwalter sv = new Standortverwalter ();
    Regal r = null;
    ArrayList<RegalEtage> liste = new ArrayList<RegalEtage> ();

    if (((String) ortcombo.getSelectedItem ())
        .equals (uebersetzung.lokal
        .gibUebersetzung ("Keine Standorte vorhanden")))
    {
    }
    else
    {
      ortindex = ortcombo.getSelectedIndex ();
      id = sid[ortindex];
      s = sv.gibStandort (id);
    }

    rid = stringZuInteger ((String) regalcombo.getSelectedItem ());
    if (s != null)
    {
      r = s.gibRegal (rid);
    }
    if (r != null)
    {
      liste = r.gibRegalEtage ();
    }

    if (liste.size () != 0)
    {
      etagen = new String[liste.size ()];
      for (int i = 0; i < liste.size (); i++)
      {
        etagen[i] = "" + liste.get (i).gibEtagenNr ();
      }
    }
    else
    {
      etagen = new String[1];
      etagen[0] = uebersetzung.lokal
      	.gibUebersetzung ("Keine Etagen vorhanden");
    }
  }


  /**
   * Erzeugen der Combobox mit den Abschnitten
   */
  public void abschnitteAnzeigen ()
  {
    int ortindex, id, rid, eNr = 0;
    Standort s = null;
    Standortverwalter sv = new Standortverwalter ();
    Regal r = null;
    RegalEtage re = null;
    ArrayList<Regalabschnitt> liste = new ArrayList<Regalabschnitt> ();

    if (((String) ortcombo.getSelectedItem ())
        .equals (uebersetzung.lokal
        .gibUebersetzung ("Keine Standorte vorhanden")))
    {
    }
    else
    {
      ortindex = ortcombo.getSelectedIndex ();
      id = sid[ortindex];
      s = sv.gibStandort (id);
    }

    rid = stringZuInteger ((String) regalcombo
        .getSelectedItem ());
    eNr = stringZuInteger ((String) etagecombo
        .getSelectedItem ());

    if (s != null)
    {
      r = s.gibRegal (rid);
    }
    if (r != null)
    {
      re = r.gibRegaletage (eNr);
    }
    if (re != null)
    {
      liste = re.gibAbschnittListe ();
    }

    if (liste.size () != 0)
    {
      abschnitte = new String[liste.size ()];
      for (int i = 0; i < liste.size (); i++)
      {
        abschnitte[i] = "" + liste.get (i).gibNummer ();
      }
    }
    else
    {
      abschnitte = new String[1];
      abschnitte[0] = uebersetzung.lokal
          .gibUebersetzung ("Keine Abschnitte vorhanden");
    }
  }

  /**
   * Erzeugt ein Exemplar und fuegt es in die Bibliothek hinzu.
   */
  public void hinzufuegen ()
  {
    /*
     * mId = Medium ID, ortId = Ort ID, regalId = Regal ID, etagenNr =
     * Etagennummer, abschnittNr = Abschnittnummer
     */
    int mId, ortId, regalId, etagenNr, abschnittNr = 0;
    Exemplar e;

    if (txt_medium.getText ().isEmpty () == true)
    {
      txt_status.setBackground (Color.RED);
      JOptionPane.showMessageDialog (null, uebersetzung.lokal
          .gibUebersetzung ("Es muss ein Medium angegeben werden"),
          uebersetzung.lokal.gibUebersetzung ("Medium Fehler"),
          JOptionPane.WARNING_MESSAGE);
      txt_status.setBackground (Color.red);
      txt_status.setText ("");
    }
    else
    {
      if (((String) abschnittcombo.getSelectedItem ())
          .equals (uebersetzung.lokal
              .gibUebersetzung ("Keine Abschnitte vorhanden")))
      {
        txt_status.setBackground (Color.RED);
        JOptionPane.showMessageDialog (null, uebersetzung.lokal
            .gibUebersetzung ("Es kann kein Medium hinzugefuegt " +
            "werden, da kein Abschnitte vorhanden sind"), null, 
            JOptionPane.WARNING_MESSAGE);
        txt_status.setBackground (Color.red);
        txt_status.setText ("");
      }
      else
      {
        Mediumverwalter mv = new Mediumverwalter ();
        mId = stringZuInteger (txt_medium.getText ());
        System.out.println (""+mId);
        Medium m = mv.gibMedium (mId);
        ortId = sid[ortcombo.getSelectedIndex ()];
        System.out.println (""+ortId);
        regalId = stringZuInteger ((String) regalcombo
            .getSelectedItem ());
        System.out.println (""+regalId);
        etagenNr = stringZuInteger ((String) etagecombo
            .getSelectedItem ());
        System.out.println (""+etagenNr);
        abschnittNr = stringZuInteger ((String) abschnittcombo
                .getSelectedItem ());
        System.out.println (""+abschnittNr);
        try
        {
          e = new Exemplar (ortId, m, regalId, etagenNr, abschnittNr);
          mv.exemplarHinzufuegen (e);
          txt_status.setBackground (Color.GREEN);
          txt_status.setText ("EAN: "+e.gibBarcode ().gibEAN13 ());
        }
        catch (MediumIstZuGross e1)
        {
          JOptionPane.showMessageDialog (null, "" + uebersetzung.
              lokal.gibUebersetzung (e1.getMessage ()), null, 
              JOptionPane.WARNING_MESSAGE);
        }
        catch (NullPointerException e2)
        {
          JOptionPane.showMessageDialog (null, uebersetzung.lokal
              .gibUebersetzung ("Dieses Medium existiert nicht"), ""
              + e2.getMessage (), JOptionPane.WARNING_MESSAGE);
        }
      }
    }
  }

  
  /**
   * Wandelt Strings in Integer um
   * @param s String der umgewandelt wird
   * @return String wird als Integer zurueck gegeben.
   */
  public static int stringZuInteger (String s)
  {
    int temp = 0;
    try
    {
      temp = Integer.parseInt (s.trim ());
    }
    catch (Exception e)
    {
    }
    return temp;
  }
}
